// 例子6

function test(foo) {
    console.log(foo);
    console.log(bar);

    var foo = 'hello';
    console.log(foo);
    var bar = function () {
        return 'world';
    }

    function foo() {
        return 'hello';
    }
}

test('test');

// 执行上下文变量对象创建和执行过程
// // 创建阶段
// testEC = {
//     VO: {
//         arguments: {
//             0: 'test',
//             length: 1
//         },
//         foo: <foo reference> , // function声明覆盖了形参foo的声明;
//                                // var声明变量遇到同名属性值时，会跳过
//         bar: undefined
//     },
//     scopeChain: {...},
//     this: window
// }

// // 执行阶段 VO -> AO
// testEC = {
//     VO: {
//         arguments: {
//             0: 'test',
//             length: 1
//         },
//         foo: 'hello', // 这里原来的foo: <foo reference>函数引用被覆盖
//         bar: <bar reference>
//     },
//     scopeChain: {...},
//     this: window
// }


console.log('##############################')

// 变化顺序后
function test(foo) {
    function foo() {
        return 'hello';
    }

    var foo;
    var bar;
    console.log(foo);
    console.log(bar);
    foo = 'hello';
    console.log(foo);
    bar = function () {
        return 'world';
    }
}

test('test');